package com.novanok.googledocxlstest.dao;

import android.util.Log;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.novanok.googledocxlstest.Comun.Comun;
import com.novanok.googledocxlstest.entidad.Cliente;
import com.novanok.googledocxlstest.entidad.estado.EstadoModificado;
import com.novanok.googledocxlstest.entidad.estado.EstadoNuevo;
import com.novanok.googledocxlstest.entidad.estadosync.EstadoSincronizacionEnLaNube;
import com.novanok.googledocxlstest.entidad.estadosync.EstadoSincronizacionNoSincronizado;

import java.net.URL;

public class DAODrive {
    private static final String TAG = "DAODrive";
    private String usuario;
    private String clave;

    public DAODrive(){
        this.setUsuario("marcosdonalisio@gmail.com");
        this.setClave("marcos30970084");
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

    public synchronized void persistir( Cliente cliente ){
        if ( cliente.getEstado() instanceof EstadoModificado || cliente.getEstado() instanceof EstadoNuevo ) {
            if ( cliente.getEstadoNube() instanceof EstadoSincronizacionNoSincronizado) {
                this.insertar(cliente);
            } else {
                this.actualizar(cliente);
            }
        }

        cliente.setEstadoNube(new EstadoSincronizacionEnLaNube());
    }

    private void insertar( Cliente c ){
        SpreadsheetService spreadsheet = new SpreadsheetService("v1");
        spreadsheet.setProtocolVersion(SpreadsheetService.Versions.V3);

        try {
            spreadsheet.setUserCredentials(this.getUsuario(), this.getClave());
            URL metafeedUrl = new URL(Comun.getUrl());
            SpreadsheetFeed feed = spreadsheet.getFeed(metafeedUrl, SpreadsheetFeed.class);

            SpreadsheetEntry sp = feed.getEntries().get(0);
            WorksheetEntry w =  sp.getWorksheets().get(0);

            URL listFeedUrl = w.getListFeedUrl();
            ListFeed listFeed = spreadsheet.getFeed(listFeedUrl, ListFeed.class);

            ListEntry row = new ListEntry();
            row.getCustomElements().setValueLocal("deviceId", Comun.getDispositivoId());
            row.getCustomElements().setValueLocal("firstname", c.getApellido());
            row.getCustomElements().setValueLocal("lastname", c.getNombre());

            row = spreadsheet.insert(listFeedUrl, row);

            c.setId(row.getId());

            Log.d(TAG, "Cliente Guardado!!!");
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }

    private void actualizar( Cliente c ){

    }

    public void eliminar(Cliente c) {
        SpreadsheetService spreadsheet = new SpreadsheetService("v1");
        spreadsheet.setProtocolVersion(SpreadsheetService.Versions.V3);

        try {
            spreadsheet.setUserCredentials( this.getUsuario(), this.getClave() );
            URL metafeedUrl = new URL(Comun.getUrl());
            SpreadsheetFeed feed = spreadsheet.getFeed( metafeedUrl, SpreadsheetFeed.class );

            SpreadsheetEntry sp = feed.getEntries().get( 0 );
            WorksheetEntry w = sp.getWorksheets().get( 0 );

            URL listFeedUrl = w.getListFeedUrl();
            ListFeed listFeed = spreadsheet.getFeed( listFeedUrl, ListFeed.class );

            ListEntry eliminar = null;
            for ( ListEntry map : listFeed.getEntries() ) {
                if ( map.getId().compareTo(c.getId()) == 0 ) {
                    eliminar = map;
                    break;
                }
            }

            if ( eliminar != null ) {
                eliminar.delete();
                Log.d(TAG, "Cliente eliminado");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
